mistioで監視内容に応じて任意の処理を行ってみる
mist.ioネタ2連続の市田です。
前回紹介したmist.ioについて、今回はSSHアクセスを許可した場合にできることについて紹介したいと思います。
mist.ioでSSHアクセスでできること
SSH鍵をmist.ioに登録すると、次のことができるようになります。
管理画面上から任意のスクリプト実行
- サーバにログインせずに実行可能です。
- スクリプトの内容も管理画面上から入力できます。
監視内容をトリガーにした任意のスクリプト実行
- 例:CPU80%を超えたら指定プロセスを再起動する、といったことが可能になります。
要するに、管理画面からmist.ioのサーバ経由でSSHによる各種コマンドやスクリプトを実行できるという仕組みです。
SSH鍵の登録
事前準備
SSH鍵はmist.ioのサーバに登録する形となりますが、mist.io側からSSHアクセスできることが確認されないと登録ができません。
その為、事前にmist.ioからのSSHアクセスを許可しておく必要がありますが、そのIPアドレスが不明なためSSHアクセスをSecurityGroupでAnywhereで許可しておく必要があります。
SSH鍵の登録
では管理画面から登録してみます。
最初はなにもないので、「NEW KEY」を選択します。
「Name」は任意です。「PrivateKey」の部分は直接鍵の内容を貼り付けてもいいですし、「UPLOAD」ボタンでローカルの鍵ファイルをアップロードしても構いません。
ただし、ここで「GENERATE」してもその鍵がサーバに反映される訳ではないので、ここでは「GENERATE」は選択することはないと思います。
登録には少し時間がかかります。(30秒くらい)
登録が完了すると、登録した鍵が表示されます。
SSH鍵が登録されると、「BASIC INFO」の欄にサーバリソースの情報が表示されます。SSHでアクセスできるようになった為と思われます。
Webコンソール
SSH鍵を登録すると、管理画面上からサーバにログインすることができるようになります。
先ほどのサーバの詳細画面の下部に「SHELL」という表示がクリックできるようになっています。
クリックすると、CLIでSSHログインした状態が再現されます。mist.ioからアクセスしている状態が表示されているようです。
画面下の「BACK」をクリックするとログアウトします。
監視アクションの追加
mist.ioは監視項目の値によって任意のアクションを実行することができます。
先ほどのグラフ追加の項目の下にある「ADD RULE」を追加します。
次のような設定が出てくるので、それぞれの四角になっている箇所を希望に合わせて変更します。
「alert」になっている箇所をクリックすると、実行したいアクションを選択できます。
「ALERT」はメール通知です。ここでは「COMMAND」を選択してみます。
表示されるポップアップで実行したいコマンドを入力します。
下記の内容のルールだと「5分以内のRAMの値が20%を超えたら、apacheを再起動」という内容になります。
登録が完了すると画面下部にある「ACTIVITY LOG」という箇所に「request」というカテゴリのログが現れます。
これは、先ほど設定したルールが登録されたことを示しています。
しばらくすると、監視トリガーが発動して指定のコマンドが実行されたログが表示されます。
実際、サーバ上で下記のようにapacheが停止していることが確認できればOKです。
$ sudo systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: man:httpd(8) man:apachectl(8)
カスタムルールの繰り返し実行
前回のメール通知の場合と同様、手元で確認した限りでは、登録したscriptが一度実行されると、次の監視タイミングが来てもスクリプトは再実行されませんでした。
例えばメモリ使用率を5分毎に監視して、80%を超えたら指定のコマンドを実行する設定の場合、一度実行すると次の5分が経過してもスクリプトは実行されません。
再度保存し直すと、このルールが再びアクティブになりました。
独自スクリプトの実行
ダッシュボードから任意のスクリプトを実行可能です。 先ほどのブラウザ上のシェルではなく、予め登録しておいたスクリプトを実行できます。
管理画面のトップページから登録していきます。
「ADD SCRIPT」をクリックします。
Typeには、「Ansible Playbook」と「Executable」が選択できます。 Sourceには、「Github」「URL」「Inline」が選択できます。
今回は、Typeに「Executable」、Sourceに「Inline」を選択しました。 実行するスクリプトは下記の通りで、動作確認しやすいものにしました。
#!/bin/bash echo "hello world" | logger -t TestScript
登録が完了したら対象インスタンスの画面で「ACTIONS」をクリックします。
ここで先ほど登録したスクリプトを実行する為「RUN SCRIPT」を選択します。 前回のSSH鍵を登録しない場合には出てこなかった項目です。
「Script」プルダウンから先ほど登録した「TestScript」を選択します。 スクリプトの内容によってはパラメータを指定することも可能です。
この状態で「RUN」をクリックして実行すると、画面上に下記のようなポップアップが出ます。
また、サーバ側のログにスクリプトの実行結果が出ていればOKです。
$ journalctl -f Sep 05 11:36:15 ip-172-31-24-194.ap-northeast-1.compute.internal TestScript[7010]: hello world
インスタンス作成
管理画面からはEC2インスタンスを新規に作成することも可能です。
先ほどのインスタンス一覧の画面左側にある「CREATE MACHINE」をクリックします。
次のようにNameタグやAMI、インスタンスタイプなどを指定して「LAUNCH」をクリックします。
これで実際にEC2インスタンスが作成できます。
インスタンス作成時の注意点
私がまだ見つけられていないだけかも知れませんが、先ほどのプルダウンにはセキュリティグループの設定がありませんでした。
実際にmist.ioから作成した後でセキュリティグループを見てみると「mistio」というグループが作成されていましたが、ポリシー内容は以下の通りでした。
全てのアクセスが全てAnywhereアクセス可能な状態です。 後で修正するようにしないと、さすがにこれは使えません。。
最後に
SSH鍵を登録するだけでできることがぐっと増えました。 しかしSSH鍵を外部サービスに登録するのは抵抗を感じる方も多いのではないでしょうか?
ここはやはりオープンソース版のバージョンアップに期待したいところですね。 オープンソース版でも同様のことができるようになったら、またご紹介したいと思います。
以上です。